package com.gosling.cloudspace.config;

import com.gosling.cloudspace.common.annotation.NoRepeatSubmit;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Objects;

@Slf4j
@Aspect
//@Component
public class NoRepeatSubmitAop {

    private static final Logger logger = LoggerFactory.getLogger(NoRepeatSubmit.class);
//    @Autowired
//    RedisTemplate redisTemplate;

    /**
     * <p> 【环绕通知】 用于拦截指定方法，判断用户表单保存操作是否属于重复提交 <p>
     * <p>
     * 定义切入点表达式： execution(public * (…))
     * 表达式解释： execution：主体    public:可省略   *：标识方法的任意返回值  任意包+类+方法(…) 任意参数
     * <p>
     * com.zhengqing.demo.modules.*.api ： 标识AOP所切服务的包名，即需要进行横切的业务类
     * .*Controller ： 标识类名，*即所有类
     * .*(..) ： 标识任何方法名，括号表示参数，两个点表示任何参数类型
     *
     * @param noRepeatSubmit:自定义的注解对象
     * @return: java.lang.Object
     */
//    @Before("execution(* com.gosling.cloudspace.controller.*(..)) && @annotation(noRepeatSubmit)")
    public void doAround(NoRepeatSubmit noRepeatSubmit) throws Exception {
        try {
            HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();

            // 拿到ip地址、请求路径、token
//            AuthManager authManager = new AuthManager();
//            String ip = authManager.getCustomerIp();
//            String url = request.getRequestURL().toString();
//            String token = authManager.getCustomerToken();

            String ip = request.getHeader("ip");
            String url = request.getRequestURL().toString();
            String token = request.getHeader("token");

            // 现在时间
            long now = System.currentTimeMillis();

            // 自定义key值方式
            String key = "REQUEST_FORM_" + url + ip + token;
//            if (redisTemplate.hasKey(key)) {
//                // 上次表单提交时间
//                long lastTime = Long.parseLong((String) redisTemplate.opsForValue().get(key));
//                // 如果现在距离上次提交时间小于设置的默认时间 则 判断为重复提交  否则 正常提交 -> 进入业务处理
//                if ((now - lastTime) > noRepeatSubmit.time()) {
//                    // 非重复提交操作 - 重新记录操作时间
//                    redisTemplate.opsForValue().set(key, String.valueOf(now));
//                } else {
//                    throw new Exception("请勿重复提交");
//                }
//            } else {
//                // 这里是第一次操作
//                redisTemplate.opsForValue().set(key, String.valueOf(now));
//            }
        } catch (Throwable e) {
            logger.error("校验表单重复提交时异常: {}", e.getMessage());
            throw new Exception(e.getMessage());
        }
    }

}
